﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace DAO
{
    public class SQLDataProvider
    {
        static string connectionstring = @"Data Source=.;Initial Catalog=QuanLyHocSinh;Integrated Security=True";

        static SqlConnection connect = null;

        public static void OpenConnection()
        {
            if (connect == null)
            {
                connect = new SqlConnection(connectionstring);
                connect.Open();
            }
        }

        public static void CloseConnection()
        {
            if (connect != null)
            {
                connect.Close();
            }
        }

        #region ExecuteQueryStoredProcedure
        /// <summary>
        /// Thực hiện trả về 1 bảng dữ liệu (dùng cho Select) [Proc liệt kê có truyền tham số]
        /// </summary>
        /// <param name="spName">Tên Proc cần gọi</param>
        /// <param name="sqlParams">Các tham số dành cho Proc đó</param>
        /// <returns>Trả về 1 bảng dữ liệu</returns>
        public static DataTable ExecuteQuery(String spName, List<SqlParameter> sqlParams)
        {
            DataTable dt = new DataTable();
            try
            {
                OpenConnection();
                try
                {
                    SqlCommand command = connect.CreateCommand();
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = spName;
                    if (sqlParams != null)
                    {
                        foreach (SqlParameter param in sqlParams)
                        {
                            command.Parameters.Add(param);
                        }
                    }
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = command;
                    adapter.Fill(dt);
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    CloseConnection();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return dt;
        }

        /// <summary>
        /// Thực hiện trả về 1 bảng dữ liệu (dùng cho Select) [Proc liệt kê không truyền tham số]
        /// </summary>
        /// <param name="spName">Tên Proc cần gọi</param>
        /// <returns>Trả về 1 bảng dữ liệu</returns>
        public static DataTable ExecuteQuery(String spName)
        {
            return ExecuteQuery(spName, null);
        }

        #endregion

        #region ExecuteNoneQuery StoredProcedure

        /// <summary>
        /// Thực hiện các câu lệnh ghi lên dữ liệu (Insert, Update, Delete) [Thêm - xóa - sửa, có truyền tham số]
        /// </summary>
        /// <param name="spName">Tên Proc cần gọi</param>
        /// <param name="sqlParams">Các tham số dành cho Proc đó</param>
        /// <returns>
        /// Trả về dữ liệu kiểu số để xác định đã thành công
        /// </returns>
        public static int ExecuteNoneQuery(String spName, List<SqlParameter> sqlParams)
        {
            int n = -1;
            try
            {
                SqlConnection connect = new SqlConnection(connectionstring);
                connect.Open();
                try
                {
                    SqlCommand command = connect.CreateCommand();
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = spName;
                    if (sqlParams != null)
                    {
                        foreach (SqlParameter param in sqlParams)
                        {
                            command.Parameters.Add(param);
                        }
                    }
                    n = command.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    connect.Close();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return n;
        }

        /// <summary>
        /// Thực hiện các câu lệnh ghi lên dữ liệu (Insert, Update, Delete) [Thêm - xóa - sửa không truyền tham số]
        /// </summary>
        /// <param name="spName">Tên Proc cần gọi</param>
        /// <returns>
        /// /// Trả về dữ liệu kiểu số để xác định đã thành công
        /// </returns>
        public static int ExecuteNoneQuery(String spName)
        {
            return ExecuteNoneQuery(spName, null);
        }

        #endregion

        #region Execute Query String
        public static DataTable ExecuteQueryString(string query)
        {
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(query, connectionstring);
            DataTable dt = new DataTable();
            sqlDataAdapter.Fill(dt);
            return dt;
        }

        #endregion
    }
}
